001 /*
002 * Copyright (c) 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.tools;
020
021 import java.io.IOException;
022 import java.util.ArrayList;
023 import java.util.List;
024 import java.beans.IntrospectionException;
025
026 import net.dpml.metro.data.ContextDirective;
027 import net.dpml.metro.info.PartReference;
028 import net.dpml.metro.info.Type;
029
030 import org.apache.tools.ant.Task;
031
032 /**
033 * A context directive class.
034 *
035 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
036 * @version 1.1.1
037 */
038 public class ContextDataType
039 {
040 private String m_class;
041 private List m_builders = new ArrayList();
042
043 /**
044 * Declare a custom context implementation classname.
045 * @param classname the classname of an optional context implementation class
046 */
047 public void setClass( final String classname )
048 {
049 m_class = classname;
050 }
051
052 /**
053 * Create a new constructed part builder.
054 * @return a part builder
055 */
056 public EntryDataType createEntry()
057 {
058 final EntryDataType builder = new EntryDataType();
059 m_builders.add( builder );
060 return builder;
061 }
062
063 /**
064 * Create a name component builder.
065 * @return a new component builder
066 */
067 public ComponentBuilderTask createComponent()
068 {
069 ComponentBuilderTask builder = new ComponentBuilderTask();
070 m_builders.add( builder );
071 return builder;
072 }
073
074 /**
075 * Return all of the part reference builders.
076 * @return the set of part reference builders
077 */
078 PartReferenceBuilder[] getBuilders()
079 {
080 return (PartReferenceBuilder[]) m_builders.toArray( new PartReferenceBuilder[0] );
081 }
082
083 /**
084 * Return the optional context implementation classname.
085 * @return the classname
086 */
087 String getClassname()
088 {
089 return m_class;
090 }
091
092 /**
093 * Create a new context directive.
094 * @param classloader the classloader to use
095 * @param type the underlying component type
096 * @return the context directive
097 * @exception IntrospectionException if a class introspection error occurs
098 * @exception IOException if an I/O error occurs
099 * @exception ClassNotFoundException if a context class was not found
100 */
101 ContextDirective getContextDirective( ClassLoader classloader, Type type )
102 throws IntrospectionException, IOException, ClassNotFoundException
103 {
104 String classname = getClassname();
105 PartReferenceBuilder[] builders = getBuilders();
106 PartReference[] references = new PartReference[ builders.length ];
107 for( int i=0; i<builders.length; i++ )
108 {
109 PartReferenceBuilder builder = builders[i];
110 if( builder instanceof ComponentBuilderTask )
111 {
112 Task task = (Task) builder;
113 task.setTaskName( "component" );
114 }
115 PartReference reference = builder.buildPartReference( classloader, type );
116 references[i] = reference;
117 }
118 return new ContextDirective( classname, references );
119 }
120 }
121